home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Reference Guide / C-C++ Interactive Reference Guide.iso / c_ref / csource4 / 297_01 / prmanual.txt < prev    next >
Text File  |  1992-01-01  |  20KB  |  579 lines

  1. Feb 17 1989
  2. Revised July 22 1989
  3. Revised December 25 1991
  4. Revised January 1 1992
  5.  
  6.  
  7.         Small Prolog User Guide & Reference
  8. Introduction.
  9. -------------
  10. Small Prolog is a public domain implementation of the Prolog Language, with
  11. C source provided.
  12.  
  13. You can do what you like with the code, save claim it as your own work.
  14. If you embed this into a commercial application I would nevertheless
  15. appreciate a free copy of your software.
  16.  
  17.  There are other public domain implementations around, but I dont know of 
  18. one where you get the C code apart a public domain compiler called 
  19. Stony Brook Prolog, but it hasnt yet been ported to the PC.
  20.  
  21. The design goals were:
  22.     A minimal usable implementation.
  23.     Maximum portability.
  24.     Educational code.
  25.     Extensibility.
  26.     A small object code.
  27.     Embeddability.
  28.     Facilitate meta-programming.
  29. Of course these goals have not been fully met!
  30. It helps to read Hogger's book "An introduction to logic programming"
  31.  (Academic Press 1984)
  32. to  understand the code. You could also try
  33. Maier & Warren's "Computing with logic" - Benjamin Cummings Ed. 
  34. 1988 as an alternative.
  35.  
  36. On the negative side:
  37.  The syntax is LISP-like which has its advantages for meta-programming
  38. and small code, but I find that it is not very friendly.
  39.  
  40.  There is no garbage collection of any sort. It's surprising how far
  41. you can get away with this. If you want to garbage collect on the
  42. heap, then I suggest that you make a separate zone for pairs and 
  43. modify get_node() so that it in fact allocates a pair but only 
  44. returns the head. Then adapt the garbage collector of the  source code
  45. of Xlisp (which is public domain). 
  46.   You could also garbage collect some of the substitution stack. The
  47. only easily available literature I know of is an article by Maurice
  48. Bruynehooge in "Implementations of Prolog" edited by John Campbell,
  49. published by John Wiley. The book is full of typos, so good luck.
  50.  
  51.  There are quite a few improvements to the code to be made (at this time)
  52. such as last call optimisation.
  53.  
  54.  The trace facilities of version 2 are no longer minimal.
  55.  
  56.  Not all the "standard" builtins have been included. 
  57.  We thought you would enjoy putting these in. 
  58.  
  59. Syntax
  60. ------
  61.  The syntax of the prolog is extremely simple. You can look 
  62.  at one of the prolog source files (*.spr) provided to get an idea 
  63.  or you can look at the C souce code, or you can read the following:
  64.  
  65.  Comments are as in the C language:
  66.  /* This is a comment 
  67.   */
  68.  
  69.  The program may be layed out with as many spaces, line_feeds and
  70.  tabs as you like providing you don't chop a lexical item in two.
  71.  A lexical item is an identifier or a number or a string or 
  72.  brackets or the vertical bar.
  73.  
  74.  Although strictly speaking a program is a set of clauses
  75.  AND a query, we shall call a set of clauses a program.
  76.  
  77. The following is a context free grammar for the  syntax.
  78. Nonterminals are distinguished from terminals by putting them
  79. inside angle brackets. Comments follow the rewrite rules and are
  80. inside /* */.
  81.  
  82. <program> -> <empty>
  83. <program> -> <clause> <program>
  84.  
  85. <clause> -> <rule>
  86. <clause> -> <fact>
  87.  
  88. <rule> -> (<head> <goals>)
  89.  
  90. <fact> -> (<head>)
  91. <fact> -> <head>            /* alternative */
  92.  
  93. <head> -> (<clause predicate> <arguments>)
  94. <head> -> (<clause predicate> <arguments>|<argument>)
  95. /* use the second kind of head with caution */
  96.  
  97. <clause predicate> -> <atom other than builtin>
  98.  
  99. <arguments> -> <empty>
  100. <arguments> -> <argument><arguments>
  101.  
  102. <argument> -> <atom>
  103. <argument> -> <list>
  104. <argument> -> <integer>
  105. <argument> -> <real>            /* depends on conditional compilation */
  106. <argument> -> <string>
  107. <argument> -> <variable>
  108. <argument> -> <char>            /* depends on conditional compilation */
  109.  
  110. <atom> -> ()
  111. /* you can space the brackets out */
  112. <atom> -> <small letter><identifier tail>
  113.  
  114. <variable> -> _
  115. <variable> -> _<identifier tail>
  116. <variable> -> <capital_letter><identifier tail>
  117.  
  118. <identifier tail> -> <empty>
  119. <identifier tail> -> <character other than space,bracket,quote or bar>
  120. <identifier tail> -> <identifier tail><identifier tail>
  121.  
  122. <list> -> (<arguments>)
  123. <list> -> (<arguments>|<argument>)
  124.  
  125. <integer> -> <sign><unsigned integer>
  126. <integer> -> <unsigned integer>
  127.  
  128. <unsigned integer> -> <digit>
  129. <unsigned integer> -> <digit><unsigned integer>
  130.  
  131. <sign> -> -
  132. <sign> -> <empty>
  133.  
  134. <goals> -> <goal>
  135. <goals> -> <goal><space><goals>
  136.  
  137. <goal> -> (<predicate><space><arguments>)
  138. <goal> -> (<predicate><space><arguments>|<argument>)
  139. /* dont use this form if the predicate is builtin */
  140.  
  141. <predicate> -> <small letter><identifier tail>
  142.  
  143. <real>-><integer>.<unsigned integer>
  144.  
  145. <string> -> <string quote> <sequence of characters> <string quote>
  146. /* Dont put a string quote in the sequence of characters unless it is
  147.  * immediately followed by another string quote -only one is considered.
  148.  * 
  149.  */
  150.  
  151. <char> -> '<printable character>'
  152. <char> -> '\n'
  153. <char> -> '\r'
  154. <char> -> '\t'
  155. <char> -> '\v'
  156. <char> -> '\f'
  157. <char> -> '\''
  158. <char> -> '\"'
  159. <char> -> '\<octal digit>'
  160. <char> -> '\<octal digit><octal digit>'
  161. <char> -> '\<octal digit><octal digit><octal digit>'
  162.  
  163. <query> -> (<goals>)
  164. <query> -> <goal>
  165. /* The last form is permitted for one goal-queries */
  166.  
  167. <string quote> -> "
  168.  
  169. /* END OF GRAMMAR */
  170.  
  171. Now for 4 sample queries. You don't type the "?-".
  172. ?-((writes "Hello, world")(nl))
  173. ?-((nl))
  174. ?-(space_left Heap Strings Dyn SUb Trail Temp)
  175. ?-((writes "What is your name?")(read X)
  176.  (writes "Hello, ")(display X))
  177. ?-(writes "This :"" is an embeded double quote")
  178.  
  179.  
  180. Builtins:
  181. ---------
  182. Builtins are predefined predicates that in fact call on C code.
  183. The builtins are documented in the source file prbltin.c.
  184. The file help.spr provides "on line" documentation.
  185.  
  186. You could add more builtins by imitating that file, but 
  187. we suggest using an extra file.
  188. You should try to be consistent with Clocksin and Mellish's 
  189. builtins (see bibliography). Of course it's not as interesting 
  190. trying to define predicates like "functor", "arg" and "univ".
  191.  
  192. To add your own builtins you should know the following:
  193.  
  194. Small Prolog uses many global variables defined in prlush.c
  195. "Arguments" is the list of arguments of the current goal and "SubstGoal"
  196.  is the (substitution) environment for this. To get at the different 
  197. elements of "Arguments" you can use the ARG_XXX macros in prbltin.h.
  198. All functions make frequent use of the dereference() function in 
  199. prunify.c so it is important to understand this as soon as you have
  200. understood the basic data types. This function dereferences a
  201. term in an environment and updates the globals DerefNode and 
  202. DerefSubst which represent the resulting derefenced object. 
  203. They are globals.
  204.  
  205. The following scheme gives you an idea of how a builtin might be
  206. built.
  207.  
  208. Pmybuiltin()
  209. {
  210. /* local variables used below */
  211. int result;
  212. integer i;
  213. char *s;...
  214.  
  215. /* argument extaction macros */
  216. ARG_INT(1,i) /* the first arg expected is an INT, i is set to this */
  217. ARG_STRING(2,s); /* the second arg expected is a string */
  218. ...
  219.  
  220. result = my_function(i,s,...,&o,...);/* you define this */
  221. bind_...(3,o); /* the third argument is bound to "o" */
  222.  
  223. if(result == MY_SUCCESS/* you define this */)return 1;
  224. if(result == MY_FAIL/* ditto */)return 0;
  225. else
  226.   return(CRASH);/* force a stack dump */
  227. }
  228.  
  229. Calling a builtin with extra arguments is harmless - they are
  230. just ignored. Missing arguments or arguments of a wrong type
  231. generally force a "stack dump" so you know where the program
  232. was when it crashed. This is a print out of all pending goal lists
  233. of the ancestors of the current goal.
  234. The top-most goal list is the list of goals of the current clause.
  235. Underneath this are the goals of the clause that called that etc.
  236.  
  237. From version 2 on a builtin may backtrack by making the related 
  238. function return ND_SUCCESS. The repeat builtin does this.
  239. It is the builtin's responsability to update ND_builtin_next_nodeptr
  240. when it is called. That value is restored on backtracking and
  241. is the only information that is saved from one call to the next.
  242. See how the gennum predicate is implemented.
  243.  
  244. Input-output:
  245. -------------
  246. The input output facilities are modelled on Clocksin and Mellish's
  247. description.
  248. At any one time there is a current input "stream" and a current output
  249. stream. These are usually files. You can read from a string by
  250. setting the String_input_flag. See the definition of the function
  251. getachar() in prscan.c. You might want to write a builtin
  252. to do this.
  253.  
  254.  Similarly you might want to write on strings.
  255.  All program output that can be redirected should be done 
  256.  through pr_string. 
  257.  All program input that can be redirected should be done 
  258.  through getachar().
  259. These make use of Curr_outfile and Curr_infile respectively
  260. which represent the streams.
  261. The builtins "tell" "telling" and "told" are provided and work just
  262. as in Edinburgh Prolog.
  263.  
  264. "see", "seeing" and "seen" work just as in Edinburgh prolog. 
  265.  
  266. "writes" is used to display a string without the inverted commas.
  267. "display" will output a term.
  268. "put" is used to output a character, using the ascii code.
  269.  
  270. Arithmetic:
  271. ----------
  272. The predicates that work on reals don't work on integers and
  273. vice versa. The predicates iplus, iless, isub work on integers.
  274. If you want extra arithmetic predicates just imitate the code for these.
  275.  
  276. Tracing programs.
  277. -----------------
  278. If you #undefine TRACE_CAPABILITY Small Prolog won't be able to trace,
  279. but it will run a little faster.
  280.  
  281. A pair of global variable called Trace_flag and Tracing_now turn
  282. tracing on or off.
  283. The type of tracing involved is described in Clocksin and Mellish.
  284.  
  285.     The builtins concerned here are :
  286. trace - sets the tracing flag to 1 (on).
  287. notrace - sets the tracing flag to 0 (off).
  288.  
  289. suspend_trace - decrements the trace flag
  290. resume trace - increments the trace flag.
  291.  
  292. None of these have an argument.
  293.  
  294. The last two are useful if you dont want to see all the gory 
  295. details of the execution, in particular, concerning the 
  296. predicates you don't care tracing.
  297. From version 2 on debugging is interactive in that you may
  298. during tracing choose to step over a call (you dont care
  299. what goes on inside). The best way to see this in action
  300. is to try it out. You type a letter after each tracing step
  301. indicating what you want to do next. If you type an unknown
  302. command like a question mark for example then you will be
  303. told what you can type.
  304. Here is a more detailed explanation.
  305. Command        Explanation
  306. -------        -----------
  307. Enter   Move to next execution step
  308. a    Abort the current execution and return to top-level.
  309. n    Stop tracing but continue the execution
  310. 1    Come back to default behaviour
  311. 2    Increase the value of Trace_flag so that the rules tried
  312.     may be seen.
  313. B    Return to previous backtrack point.
  314. P    Return to parent goal (step back, you can do this several times)
  315. s    Dont trace the intermediate steps before the success or failure
  316.     of current goal.
  317. U    Unleash tracing : tracing unfolds without prompts, until the next
  318.     solution.
  319.  
  320. Reverse tracing is only possible if you have previously executed
  321. (reverse_trace_mode).
  322. This is costly in control stack space than default behaviour because
  323. it makes the stack always store all the information that non deterministic 
  324. calls need to store.
  325.  
  326. You may also want to use (logging "myfile") and (nologging)
  327. to record your trace session on a file. The first predicate expects the name 
  328. of the file in which a log of the session is recorded. The second closes
  329. the file. The logfile is closed if you quit Small Prolog the 
  330. polite way.
  331.  
  332. The builtin abort aborts the execution without forcing a stack dump.
  333. To write a builtin that does force a stack dump just make it return
  334. the manifest constant CRASH.
  335.  
  336.     This is a display of the stack of goal lists corresponding to the
  337. current state of execution. This is generally what gets shown if a 
  338. builtin is called erroneouly.
  339.  
  340. Incidentally if your program overflows a stack you get asked if you 
  341. want to see the stack of pending goals. 
  342. This could give you a hint of where things
  343. went wrong. It could just be that your program consumes too much
  344. stack space for the currently allowed stack space. This is determined
  345. by sprolog.inf.
  346.  
  347. Running Small Prolog
  348. --------------------
  349.  If you used the makefile then just type sprolog.
  350.  An MSDOS executable is provided.
  351.  If you have a 386 PC or better, a DOS-extended version
  352. called sprolog.32e is supplied as well. 
  353. This was compiled with Delorie's GNU GCC compiler for the 386. 
  354. To run this one type "go32 sprolog.32e".
  355.  
  356.  The program looks for a file called sprolog.inf
  357.  which contains 8 numbers for the 
  358.  
  359.  size of the heap (from which clauses are allocated)
  360.  size of the string zone 
  361.  size of the control stack (used by the resolution mechanism)
  362.  size of the substitution stack (used to record variable bindings)
  363.  size of the trail (used to reset the substitution stack)
  364.  size of a zone for temporary allocations (used by temp_assertz ...)
  365.  size of the read buffer (used to read atoms,strings etc )
  366.  size of the print buffer (used to print anything, this should 
  367.  be at least 80)
  368.  
  369.  If the file does not exist then default values , 32000 are used
  370.  for the first 6 and 1000 for the last two.
  371.  The normal PC sprolog expects each number to be less than
  372.  65536, but sprolog.32e will accept huge numbers here, if your
  373.  386 has enough memory. The Atari version will accept huge values 
  374.  too.
  375.  
  376.  Then Small Prolog looks for a file called sprolog.ini 
  377.  which it loads. You put commonly used predicates in this file.
  378.  
  379.  Small Prolog looks for a file called query.ini in which 
  380.  it will find the first query. This can be useful if you
  381.  are continually modifying and testing a program. You
  382.  would put somethying like (consult myfile.pro) in 
  383.  the file query.ini.
  384.  
  385.  
  386.  To load a file you can type something like (consult myfile)
  387. if the file  has no extension, or (consult "myfile.pro") if
  388.  it does have an extension.
  389.  
  390.  To leave type (quit)
  391.  
  392.  Dont forget to distinguish capitals from small letters.
  393.  
  394. Typical beginner's errors
  395. -------------------------
  396. The trivial mistakes that everyone makes:
  397.  
  398. 1) Loading a file twice.
  399. 2) Name conflicts that arise when you consult two source files
  400. in the same workspace, make sure the predicate names are different.
  401. A call on (listing) is useful here.
  402. 3) Misspellings, especially in names of variables.
  403. 4) Using capitals where you should be using small letters
  404. and vice versa.
  405. 5) Forgetting an argument.
  406. Load the file verif.spr and call (verif), it's very helpful.
  407. 6) You can't define a fact whose predicate is the name of a
  408. builtin.
  409. 7) It's easy to forget brackets. The programme pp.c can help you
  410. find misplaced brackets (but compile it first.) 
  411.  
  412. Conceptual mistakes:
  413.  
  414. Forgetting that Prolog is a relational language, unlike
  415. Lisp. You can't evaluate expressions like (iplus (iplus 2 3) 6)
  416. unless you write a recursive evaluation algorithm.
  417.  
  418. Expecting Prolog to be too close to C:
  419. Once a variable has a value it won't change.
  420.  
  421. Expecting prolog to be perfectly declarative:
  422. Using a variable before it has found a value.
  423. Simple logically correct programmes can be procedurally
  424. defective. For example, the pair of clauses:
  425.  
  426. ((father Man Child)
  427.  (son Child Man)
  428. )
  429. ((son Child Man)
  430.  (father Child Man)
  431. )
  432. will be responsable for a loop if you ask (father john peter).
  433. Some people hope that a cut will solve the problem. It wont.
  434.  
  435. As soon as you put input/output in your program you can say goodbye
  436. to a lot of the declarativity: You cant backtrack on a read for
  437. example.
  438.  
  439.  
  440. Calling Small Prolog from your application.
  441. -----------------------------------------------
  442. This supposes you link your objects with ours.
  443. Don't use our main() of course.
  444. If you are using a PC clone you may have to recompile
  445. the files using the large memory model instead of the
  446. compact memory model (which is faster).
  447.  
  448. Call init_sprolog() once and for all.
  449. Then call execute_query() with the query passed as a 
  450. string whenever you want to call a query.
  451.  
  452. Data types.
  453. ----------
  454. Prtypes.h contains an overview of the data types. 
  455. Prprint.c can give you an idea of how they fit in.
  456. The data types the end-user sees are:
  457.  
  458. variables
  459. atoms
  460. integers
  461. reals
  462. strings
  463. lists (pairs and the empty list)
  464. characters  (these were added as an afterthought)
  465.  
  466. The names of variables are jetissonned. Only their order in 
  467. a clause is retained.
  468.  
  469. Integers have the same size as pointers.
  470.  
  471.   There are some types that the Prolog user never explicitly
  472. describes with an printable object. The most important of these
  473. is the CLAUSE type, which some people call data-base references.
  474. You can bind a clause to a variable (with first_clause, for example)
  475. but you wont be able to see this binding directly. However you
  476. can use body_clause to let you look at the body of the clause -
  477. that is a list.
  478.  
  479. Then there is the predicate record. This is used by the listing
  480. predicate. It is used to create a linked list of pointers
  481. to those atoms that represent the builtins.
  482.  
  483. You can remove reals or characters and reduce code size by
  484. commenting out the #define REAL 6 and #define CHARACTER 7 lines
  485. in prtypes.h.
  486.  
  487. Suggested extensions:
  488. ----------------------
  489. Do something about variables' names. Use #ifdefs to keep the older version, 
  490.  because it's fast. You will consume more memory.
  491. Put in a rich set of numerical builtins.
  492. Improve the IO. You could snarf some code from Microemacs 3.9 for example.
  493. Improve the syntax, either in C or by a layer in Prolog.
  494. Improve the trace facilities.
  495. Add a garbage collector -you can reclaim clause space or stack space.
  496. Improve the clause indexing.
  497. Make the unification non-recursive.
  498.  
  499. Suggested Projects:
  500. --------------------
  501. Integrate this with CLIPS (available from the Austin Code Works).
  502. Integrate this with an expert system shell like Nexpert.
  503. Integrate this with Micro-Emacs (I am thinking of using text segments
  504. as data).
  505. Integrate this with Hypertext or HyperCard.
  506. Integrate this with a spreadsheet.
  507.  
  508. If you add optimisations please tell me about them.
  509.  
  510. The company that used to sell Fprolog has gone bust.
  511.  
  512. Bugs:
  513. ----
  514.  
  515. Known uncorrected problems:
  516.  Input is not very robust, incorrect syntax can lead to a core dump
  517.  on Unix.
  518.  A few trailing blanks at the end of the Prolog file can lead to a
  519.  parse error message.
  520.  clean_temp may cause problems.
  521.  Small Prolog makes you think there are more solutions to a query 
  522.  when there arent any. It has to actually look hard to find
  523.  this out.
  524.  When reverse execution mode is on it looks as if all clauses are
  525.  nondeterministic even if they are not.
  526.  
  527. Feedback:
  528. --------
  529. Please send feedback via the C User's Journal.
  530.  
  531. Bibliography:
  532. -------------
  533. W.F.Clocksin & C.S.Mellish 
  534. "Programming in Prolog"
  535. Third Edition 
  536. Springer Verlag 1987
  537.  
  538. F Klusniak & S. Spakowicz
  539. "Prolog programming for Programmers"
  540. 2nd edition Academic Press.
  541. Also discusses implementation, comes with Pascal sources
  542. of a structure-copying interpreter.
  543.  
  544. I Bratko
  545. "Prolog Programming for Artificial Intelligence"
  546. Addisson Wesley 1986
  547. (This is an excellent book that can serve as an alternative 
  548.  to Clocksin an Mellish's)
  549.  
  550. C Hogger
  551. "An Introduction to Logic Programming"
  552. Academic Press 1985
  553. (implementation verification and synthesis, an advanced book)
  554.  
  555. David Maier David S Warren 
  556. "Computing with Logic"
  557. Benjamin Cummings 1987
  558. (implementation)
  559.  
  560.  
  561. NC Rowe 
  562. "Artificial Intelligence through Prolog"
  563. Prentice Hall 1987
  564. Lots of examples.
  565.  
  566. P Boizumault
  567. "Prolog, l'implantation."
  568. Masson (Paris) 1987
  569. In depth study of implementation in Lisp, covers unusual aspects like 
  570. freeze, diff and optimizations.
  571.  
  572. J.A. Campbell
  573. "Implementations of Prolog" 
  574. Ellis-Horwood/ J Wiley 1984
  575. Advanced topics.
  576.  
  577.  
  578.  
  579.